from flask import current_app, jsonify
from flask import g
from flask import render_template
from flask import request
from flask import session

from info import redis_store, constants
from info.models import User, News, Category
from info.modules.index import index_blu
from info.response_code import RET
from info.utils.commen import user_login_data


@index_blu.route('/news_list')
def news_list():
    '''展示首页新闻列表
    1.从请求参数里获取到新闻分类,页数,每页显示的新闻数量
    2.判断参数是否正确传入,int
    3.如果请求的不是默认的新闻分类 id=1 ,将查询条件添加到filter语句列表,用的时候解包
    4.try:以分页的形式查询数据,获取总页数,当前页数,当前页显示的新闻列表(查到的是basequery)
    5.对查到的当前页数据进行遍历,调用to_dict方法,存到字典中,并添加到一个新的列表
    6.将新的包含数据字典的列表传入data.
    '''
    cid = request.args.get('cid', 1)
    page = request.args.get('page', 1)
    per_page = request.args.get('per_page', 10)
    try:
        # 如果传入的是数字类型的参数,进行int转换时不会报错
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 首页新闻展示加入审核通过的状态过滤
    filters_list = [News.status==0]
    if cid != 1:
        # 将查询条件加入到条件列表,查询条件返回的并不是bool
        filters_list.append(News.category_id == cid)
    # 以分页的形式查询数据,按新闻产生的时间排序
    try:
        paginate = News.query.filter(*filters_list).order_by(News.create_time.desc()).paginate(page, per_page, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='数据查询失败')
    # 获取分页查询的数据
    current_page = paginate.page
    total_pages = paginate.pages
    # items取得的结果是一个模型对象,需要进行遍历,再调用to_dict
    news_model_list = paginate.items
    news_dict_li = []
    for news in news_model_list:
        news_dict_li.append(news.to_basic_dict())
    # 将当前页数和总页数也传给前端,以便前端进行其他操作
    data = {
        "total_page": total_pages,
        "current_page": current_page,
        "news_dict_li": news_dict_li
    }
    return jsonify(errno=RET.OK, errmsg='ok', data=data)


@index_blu.route('/')
@user_login_data
def index():
    """首页用户登录状态显示
    1.在用户请求首页数据时去数据库查询用户数据,如果查到,将数据传给前端进行渲染,显示用户名和头像
    """

    # 请求首页时,获取新闻分类信息返回给前端
    # 查询到的是basequery
    categories = Category.query.all()
    category_li = []
    for category in categories:
        category_li.append(category.to_dict())
    # 在请求根路由时,获取新闻的点击排行,并将数据传给前端
    # 排行只显示六条新闻的标题
    news_list = None
    # 从数据库中查询
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)  # 返回basequery
    except Exception as e:
        current_app.logger.error(e)
    click_news_list = []
    # 三元表达式
    for news in news_list if news_list else []:
        # to_basc_dict返回一个字典
        click_news_list.append(news.to_basic_dict())
    # ===取到用户id,如果没取到说明用户没有登录,返回none===
    user=g.user
    # user_id = session.get("user_id", None)
    # # 如果取到用户id,从数据库中查询用户是否存在
    # user = None
    # if user_id:
    #     try:
    #         user = User.query.get(user_id)
    #     except Exception as e:
    #         current_app.logger.error(e)
    # to_dict封装在models里,返回一个字典
    # resp_dict = {
    #     "id": self.id,
    #     "nick_name": self.nick_name,
    #     "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "",
    #     "mobile": self.mobile,
    #     "gender": self.gender if self.gender else "MAN",
    #     "signature": self.signature if self.signature else "",
    #     "followers_count": self.followers.count(),
    #     "news_count": self.news_list.count()
    # }
    # user.to_dict() if user else None  相当于三元表达式 调教成立才执行函数
    data = {
        "user_info": user.to_dict() if user else None,
        'click_news_list': click_news_list,
        'category_li': category_li
    }
    # click_news_list 保存着新闻信息的字典的列表
    # data={'user': {'avatar_url': '', 'mobile': '18811112222', 'followers_count': 0....}}
    return render_template('news/index.html', data=data)


@index_blu.route('/favicon.ico')
def favi():
    return current_app.send_static_file('news/favicon.ico')
